package com.suray.wcs.service.config.resolver;

import com.alibaba.fastjson.JSON;
import com.suray.commin.annotation.RvgLog;
import com.suray.wcs.service.system.entity.InterfaceLogRvg;
import com.suray.wcs.service.system.service.impl.InterfaceLogRgvServiceImpl;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.lang.reflect.Method;
import java.util.Date;

@Aspect
@Component
public class RvgLogAspect {
    @Autowired
    private InterfaceLogRgvServiceImpl interfaceLogRgvService;

    //定义切点 @Pointcut
    //在注解的位置切入代码
    @Pointcut("@annotation(com.suray.commin.annotation.RvgLog)")
    public void logPointCut() {
    }

    // 配置切面通知
    @Around(value = "logPointCut()")
    public Object saveInterfaceLog(ProceedingJoinPoint joinPoint) throws Throwable {
        // 从切面织入点处通过反射机制获取织入点处的方法
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        //获取切入点所在的方法
        Method method = signature.getMethod();
        // 获取操作
        RvgLog rvgLog = method.getAnnotation(RvgLog.class);
        // 执行方法的中文描述
        String methodDes_zh = null;
//        // 发送源
//        String sender = null;
//        // 接收源
//        String recipient = null;
        // 是否启用方法日志记录
        boolean useMethod = true;
        // 日志对象不为null
        if (null != rvgLog) {
            methodDes_zh = rvgLog.value();
//            sender = rvgInterfaceLog.sender();
//            recipient = rvgInterfaceLog.recipient();
            useMethod = rvgLog.useMethod();
        }

        Object obj = null;

        // 是则记录方法日志
        if (useMethod) {
            // 执行方法的请求参数
            Object[] args = joinPoint.getArgs();
            // 创建接口日志对象
            InterfaceLogRvg interfaceLogRvg = new InterfaceLogRvg();
            //任务编号
            interfaceLogRvg.setTackId(null);
            //设备名，目前无法获得，默认null
            interfaceLogRvg.setDeviceName(null);
            // 发送消息
            interfaceLogRvg.setMessage(methodDes_zh);
            //接受方法请求的参数
            interfaceLogRvg.setRgvParamsIn(JSON.toJSONString(args));
            // 方法执行开始时间
            long startTime = System.currentTimeMillis();
            long  endTime;
            try{
                // 执行方法，返回对象为object
                obj = joinPoint.proceed();
            }catch (Exception e){
                //执行方法结束时间
                endTime = System.currentTimeMillis();
                //消耗时间
                long useTime = endTime - startTime;
                // 执行方法的返回对象
                interfaceLogRvg.setBacktrack(JSON.toJSONString(e == null ? "" : e));
                // 操作时间
                interfaceLogRvg.setOperateTime(new Date(startTime));
                // 状态  出现异常则为1
                interfaceLogRvg.setState(1);
                //存入消耗时间
                interfaceLogRvg.setUseTime(useTime);
                // 保存日志记录
                interfaceLogRgvService.save(interfaceLogRvg);

                throw e;
            }

            //执行方法结束时间
            endTime = System.currentTimeMillis();
            //消耗时间
            long useTime = endTime - startTime;
            // 执行方法的返回对象
            interfaceLogRvg.setRgvParamsIn(JSON.toJSONString(obj));
            // 操作时间
            interfaceLogRvg.setOperateTime(new Date(startTime));
            // 状态  出现异常则为1
            interfaceLogRvg.setState(0);
            //存入消耗时间
            interfaceLogRvg.setUseTime(useTime);
            // 保存日志记录
            interfaceLogRgvService.save(interfaceLogRvg);
        } else {
            try {
                // 执行方法，返回对象为object
                obj = joinPoint.proceed();
            } catch (Exception e) {
                throw e;
            }
        }

        return obj;
    }
}
